#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

//기상청서버
const int httpPort = 80;
const char* host = "www.kma.go.kr";

//-----------------------------------------------
const char* ssid = ****"; // WIFI ID
const char* password = "****"; //WIFI PASSWORD
const String url = "/wid/queryDFSRSS.jsp?zone=2817766000"; // 지역별 xml주소작성(rss)
String area = "****"; // 지역 작성(영어만 가능)
//-----------------------------------------------

bool awaitingArrivals = true;
bool arrivalsRequested = false;

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW // 매트릭스 타입 지정
#define MAX_DEVICES 8  // 도트 매트릭스 숫자
#define CS_PIN D8     // CS - D8
MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // 디바이스 설정

WiFiUDP ntpUDP;  // NTP 라이브러리 지정
NTPClient timeClient(ntpUDP, "pool.ntp.org");

unsigned long previousMillis = 0;
WiFiClient client;

// 지역 정보
String Temp = ""; // 온도
String Humi = ""; // 습도
String WfEn = ""; // 날씨(영어)
String WfKor = ""; // 날씨(한글)

void setup() {
  Serial.begin(115200);
  Display.begin();
  Display.setIntensity(8); // 밝기조정
  Display.displayClear(); // 초기화
  timeClient.begin();
  timeClient.setTimeOffset(32400);
  connectWiFi();
  weatherData();
}

void loop() {
  timeClient.update();
  time_t epochTime = timeClient.getEpochTime();
  
  unsigned long currentMillis = millis();
  int Hour = timeClient.getHours();
  int SetHour = 0;
  int Minute = timeClient.getMinutes();
  String mm;
  String APM = "";

  if(Hour > 12){SetHour = Hour - 12;}else{SetHour = Hour;}
  if(Hour > 11){APM = "PM";}else{APM = "AM";}
  if(Minute < 10){mm = ":0";}else{mm = ":";}

  Serial.println(area);
  Display.setTextAlignment(PA_CENTER); 
  Display.print(area);
  MATfor();
  
  Serial.println(String("")+ SetHour + mm + Minute + " " + APM);
  Display.setTextAlignment(PA_CENTER); 
  Display.print(String("")+ SetHour + mm + Minute + " " + APM);
  MATfor();
  
  Serial.println("Temp " + Temp + "*C");
  Display.setTextAlignment(PA_CENTER); 
  Display.print("Temp " + Temp + "'C");
  MATfor();

  Serial.println("Humi " + Humi + "%");
  Display.setTextAlignment(PA_CENTER); 
  Display.print("Humi " + Humi + "%");
  MATfor();

  Serial.print(WfEn); Serial.println("(" + WfKor + ")");
  Display.setTextAlignment(PA_CENTER); 
  Display.print(WfEn);
  for(int i = 0 ; i < 14 ; i++){
      Display.setIntensity(i);
      //Serial.println(i);
      delay(90);
    }
  weatherData();
  for(int i = 13 ; i > -1 ; i--){
      Display.setIntensity(i);
      //Serial.println(i);
      delay(90);
  }
}

void weatherData(){
  Display.setIntensity(13);
  Serial.print("Weather get..");
  if(client.connect(host, httpPort)){
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
    "Host: " + host + "\r\n" + 
    "Connection: close\r\n\r\n");
    delay(50);
  }else{Serial.print("."); return;}
   while(client.connected()){
    String line = client.readStringUntil('\n');
    if(line == "\r"){
      Serial.print(".");
      break;
    }
  }

  String matchString = "";
  while(client.available()){
    Serial.print(".");
     String line = client.readStringUntil('\e');
     //온도
    int temp = line.indexOf("</temp>");
      if(temp>0){       
        String tmp_str = "<temp>";
        String wt_temp = line.substring(line.indexOf(tmp_str)+tmp_str.length(),temp);
        Temp = wt_temp;
       }else{return;}
    //습도
    int reh = line.indexOf("</reh>");
      if(reh>0){
        String tmp_str = "<reh>";
        String wt_humi = line.substring(line.indexOf(tmp_str)+tmp_str.length(),reh);
        Humi = wt_humi;
      }else{return;}
    //날씨 영어
    int wfEn = line.indexOf("</wfEn>");
    if(wfEn>0){
      String tmp_str = "<wfEn>";
      String wt_wfEn = line.substring(line.indexOf(tmp_str)+tmp_str.length(),wfEn);
      WfEn = wt_wfEn;  
    }else{return;}
    //날씨 한글
    int wfKor = line.indexOf("</wfKor>");
    if(wfKor>0){
      String tmp_str = "<wfKor>";
      String wt_wfKor = line.substring(line.indexOf(tmp_str)+tmp_str.length(),wfKor);
      WfKor = wt_wfKor;
    }else{return;}
  }
  Serial.println("Completed");
  delay(1000);
}

void connectWiFi(){
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  
  // 와이파이 연결
  WiFi.begin(ssid, password);
  Serial.print("WIFI Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Display.setTextAlignment(PA_CENTER); // 매트릭스 센터 출력
    Display.print("Loading..."); // Loading... 출력
    Serial.print(".");
  }
  Serial.println("Completed");
}

void MATfor(){     //밝기 조정 0~15~0
    for(int i = 0 ; i < 16 ; i++){
      Display.setIntensity(i);
      //Serial.println(i);
      delay(90);
    }
    for(int i = 15 ; i > -1 ; i--){
      Display.setIntensity(i);
      //Serial.println(i);
      delay(90);
  }
}